package com.cherry.web.controller.system;

import com.cherry.common.constant.UserConstants;
import com.cherry.common.core.controller.BaseController;
import com.cherry.common.core.domain.AjaxResult;
import com.cherry.common.core.domain.Ztree;
import com.cherry.common.core.domain.entity.SysMajor;
import com.cherry.common.utils.StringUtils;
import com.cherry.system.service.ISysMajorService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 专业管理 控制层
 *
 * @author 孙晨阳
 */
@Controller
@RequestMapping("/system/major")
public class SysMajorController extends BaseController {

    private static final String PREFIX = "system/major";

    @Resource
    private ISysMajorService majorService;

    /**
     * 跳转至专业管理页面
     *
     * @return 跳转的页面
     */
    @GetMapping()
    public String major() {
        return PREFIX + "/major";
    }

    /**
     * ajax请求专业数据集合
     *
     * @param major 专业信息条件
     * @return 专业信息结果
     */
    @PostMapping("/list")
    @ResponseBody
    public List<SysMajor> list(SysMajor major) {
        return majorService.selectMajorList(major);
    }

    /**
     * 跳转至新增专业页面
     *
     * @param parentId 跳转时选择的父组织
     * @param mmap     传递的属性键值对
     * @return 跳转的页面
     */
    @GetMapping("/add/{parentId}")
    public String add(@PathVariable("parentId") Long parentId, ModelMap mmap) {
        mmap.put("major", majorService.selectMajorById(parentId));
        return PREFIX + "/add";
    }

    /**
     * 跳转至选择专业树
     *
     * @param majorId   专业ID
     * @param excludeId 排除ID
     * @param mmap      传递的属性键值对
     * @return 专业树页面
     */
    @GetMapping(value = {"/selectMajorTree/{majorId}", "/selectMajorTree/{majorId}/{excludeId}"})
    public String selectMajorTree(@PathVariable("majorId") Long majorId,
                                  @PathVariable(value = "excludeId", required = false) Long excludeId, ModelMap mmap) {
        mmap.put("major", majorService.selectMajorById(majorId));
        mmap.put("excludeId", excludeId);
        return PREFIX + "/tree";
    }

    /**
     * 加载专业列表树（排除下级）
     *
     * @param excludeId 要排除的下级ID
     * @return 结果
     */
    @GetMapping("/treeData/{excludeId}")
    @ResponseBody
    public List<Ztree> treeDataExcludeChild(@PathVariable(value = "excludeId", required = false) Long excludeId) {
        SysMajor major = new SysMajor();
        major.setExcludeId(excludeId);
        return majorService.selectMajorTreeExcludeChild(major);
    }

    /**
     * 校验专业名称是否唯一
     *
     * @param major 专业名称信息
     * @return 结果
     */
    @PostMapping("/checkMajorNameUnique")
    @ResponseBody
    public String checkMajorNameUnique(SysMajor major) {
        return majorService.checkMajorNameUnique(major);
    }

    /**
     * 专业管理页面新增专业
     *
     * @param major 专业信息
     * @return 结果
     */
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(@Validated SysMajor major) {
        if (UserConstants.MAJOR_NAME_NOT_UNIQUE.equals(majorService.checkMajorNameUnique(major))) {
            return error("新增专业'" + major.getMajorName() + "'失败，专业名称已存在");
        }
        major.setCreateBy(getLoginName());
        return toAjax(majorService.insertMajor(major));
    }

    /**
     * 跳转至修改专业页面
     *
     * @param majorId 要修改的专业
     * @param mmap    要传递的属性键值对
     * @return 修改页面
     */
    @GetMapping("/edit/{majorId}")
    public String edit(@PathVariable("majorId") Long majorId, ModelMap mmap) {
        SysMajor major = majorService.selectMajorById(majorId);
        if (StringUtils.isNotNull(major) && 100L == majorId) {
            major.setParentName("无");
        }
        mmap.put("major", major);
        return PREFIX + "/edit";
    }

    /**
     * 修改专业信息
     *
     * @param major 专业信息
     * @return 结果
     */
    @PostMapping("/edit")
    @ResponseBody
    public AjaxResult editSave(@Validated SysMajor major) {
        Long majorId = major.getMajorId();
        if (UserConstants.MAJOR_NAME_NOT_UNIQUE.equals(majorService.checkMajorNameUnique(major))) {
            return error("修改专业'" + major.getMajorName() + "'失败，专业（学院）名称已存在");
        } else if (major.getParentId().equals(majorId)) {
            return error("修改专业'" + major.getMajorName() + "'失败，上级专业（学院）不能是自己");
        } else if (StringUtils.equals(UserConstants.MAJOR_DISABLE, major.getStatus()) && majorService.selectNormalChildrenMajorById(majorId) > 0) {
            return error("修改专业'" + major.getMajorName() + "'失败，该部门包含未停用的子部门！");
        }
        major.setUpdateBy(getLoginName());
        return toAjax(majorService.updateMajor(major));
    }

    /**
     * 删除学院或专业
     *
     * @param majorId 删除的学院或专业ID
     * @return 结果
     */
    @GetMapping("/remove/{majorId}")
    @ResponseBody
    public AjaxResult remove(@PathVariable("majorId") Long majorId) {
        if (majorService.selectMajorCount(majorId) > 0) {
            return AjaxResult.warn("存在下级学院或专业，不允许删除");
        }
        if (majorService.checkMajorExistUser(majorId)) {
            return AjaxResult.warn("学院或专业存在学生，不允许删除");
        }
        return toAjax(majorService.deleteMajorById(majorId));
    }

    /**
     * 专业状态修改
     *
     * @param major 专业信息
     * @return 结果
     */
    @PostMapping("/changeStatus")
    @ResponseBody
    public AjaxResult changeStatus(SysMajor major) {
        if (majorService.selectMajorCount(major.getMajorId()) > 0) {
            return AjaxResult.warn("存在下级学院或专业，不允许停用");
        }
        if (majorService.checkMajorExistUser(major.getMajorId())) {
            return AjaxResult.warn("学院或专业存在学生，不允许停用");
        }
        return toAjax(majorService.changeStatus(major));
    }
}
